[Genuino 101][Johnny-Five] IC 温度センサ LM35 の制御および注意点
車輪開発大好きおたいがです。こんにちは。( 挨拶 )
今回は Genuino 101 ( 以下 Genuino ) と Johnny-Five を使用した温度センサ (LM35DZ) の制御についてまとめてみました。
LM35 でググると情報がたくさん出てきます。かなりお約束的な IC のようですが、Genuino で使用するときには注意すべき点があるようです。
動作環境・道具など
- Genuino 101
- USB ケーブル
- ブレッドボード
- ジャンパーワイヤ
- 高精度 IC 温度センサ LM35DZ
- Windows 7 Pro (64bit)
- Arduino IDE 1.6.9 ( セットアップ記事を参考にしてください )
- Node.js v4.4.7
回路図
電源 と GND を挿し間違えると、センサが熱くなり、触ると悲惨なことになるので注意しましょう。出力ピンは Genuino のアナログピンに接続します。
サンプルスケッチ ( プログラム ) をボードに書き込む
Genuino に StandardFirmata スケッチを書き込みます。
( 参照 : https://dev.classmethod.jp/hardware/johnny-five-genuino-101-debut/#toc--- )
Johnny-Five 実行用のサンプルプロジェクト作成および実行
Johnny-Five の導入および実行するためのプロジェクトを用意します。任意のプロジェクトディレクトリを作成して移動したあとに、下記コマンドを入力します。
package.json の初期化
$npm init
Johnny-Five のダウンロード
$npm install johnny-five
Barcli のダウンロード
センサの結果を可視化するシンプルなモジュールを今回利用します。
$npm install barcli
サンプルコードの作成
var five = require('johnny-five'); // Genuino が接続されているポート番号 ( `/dev/tty*` (Mac/Linux) or `COM*` (Windows) ) var board = new five.Board({ 'port': 'COM8' }); var Barcli = require('barcli'); //華氏温度 var fahrenheitGraph = new Barcli({ 'label': 'Fahrenheit', 'range': [32, 122] }); //摂氏温度 var celsiusGraph = new Barcli({ 'label': 'Celsius', 'range': [0, 50] }); //絶対温度 var kelvinGraph = new Barcli({ 'label': 'Kelvin', 'range': [273, 325] }); board.on('ready', function() { var temp = new five.Thermometer({ 'controller' : 'LM35', 'pin' : 'A0' }); temp.on('change', function(data, err) { fahrenheitGraph.update(data.F); //fahrenheit celsiusGraph.update(data.C); //celsius kelvinGraph.update(data.K); //kelvin }); });
実行
$node index
結果?
あからさまに数字がおかしいですね…
いろいろ調べてみたところ、Arduino の公式サイトに以下のようなドキュメントがありました。
Arduino Playground - LM35HigherResolution
どうやら、アナログピンで取得した値の式に問題があるようです。ここで、Johnny-Five の Thermometer クラスのソースを読んでみます。
ドキュメントに書かれていた式がありました。(L:311)
// http://www.ti.com/lit/ds/symlink/lm35.pdf LM35: { initialize: { value: analogHandler }, toCelsius: { value: function(raw) { // VOUT = 1500 mV at 150°C // VOUT = 250 mV at 25°C // VOUT = 550 mV at 55°C var mV = this.aref * 1000 * raw / 1024; // 10mV = 1°C // // Page 1 return Math.round(mV / 10); } } },
上記ハイライト行の式を以下のように修正してみます。
// var mV = this.aref * 1000 * raw / 1024; var mV = raw * 10 / 9.31;
これで再度実行すると…
それっぽい数字が出力されましたが、本当にこれで良いのかは正直自信がありません。。。